package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func foo1() {
	s1 := make([]int, 3, 4)
	s2 := append(s1, 1) // 这里重新定义并赋值给s2
	/*
		问题1：请问s1、s2内各有什么元素？
		- 此时s1中元素为：[0,0,0] s2:[0,0,0,1]
		问题2：s1修改一个元素会影响s2吗？
		- 会
		问题3： s2修改一个元素会影响s1吗？
		- 要分情况来看，如果修改的索引小于3，则会影响s1，否则不会影响s1
		问题4：s2再增加一个元素会怎么样？
		- 在s2未增加元素前，s1和s2共用底层数组，指向同一个header，此时长度和容量均为4，
		  此时若再增加一个元素，则会因为之前底层数组的长度和容量均无法满足当前要求，
		  会发生值拷贝，而重新申请新的内存空间进行存储底层数组
	*/
	fmt.Printf("s1 init:%v,%p\n", s1, &s1[0])
	fmt.Printf("s2 init:%v,%p\n", s2, &s2[0])

	s2[1] = 10
	fmt.Printf("s1 index <3:%v,%p\n", s1, &s1[0])
	fmt.Printf("s2 index <3::%v,%p\n", s2, &s2[0])

	s2[3] = 100
	fmt.Printf("s1 index >3::%v,%p\n", s1, &s1[0])
	fmt.Printf("s2 index >3::%v,%p\n", s2, &s2[0])

	s2 = append(s2, 123)
	fmt.Printf("s1 append s2 :%v,%p\n", s1, &s1[0])
	fmt.Printf("s2 append s2 :%v,%p\n", s2, &s2[0])
}

func foo2(s []int) []int {
	sLength := len(s) - 1
	result := make([]int, 0, sLength)
	for i := 0; i < sLength; i++ {
		result = append(result, s[i]+s[i+1])
	}
	return result
}

func getRandomNumber(minNumber, maxNumber int) int {
	return rand.Intn(maxNumber-minNumber) + minNumber
}

// minNumber,maxNumber：随机数最小和最大区间
// randomNumberCount：生成的随机数量
func foo3(minNumber, maxNumber, randomNumberCount int) ([]int, map[int]int) {
	numbers := make([]int, 0, randomNumberCount) // 定义slice 用于存储随机数
	counter := make(map[int]int)                 // 定义map 用于存储随机数出现的次数

	for i := 0; i < randomNumberCount; i++ {
		randomNumber := getRandomNumber(minNumber, maxNumber)
		if _, ok := counter[randomNumber]; !ok {
			counter[randomNumber] = 1
		} else {
			counter[randomNumber]++
		}
		numbers = append(numbers, randomNumber)
	}
	sort.Ints(numbers)
	// for k, v := range counter {
	// 	fmt.Printf("k is: %v ,repeat count is: %v\n", k, v)
	// }
	return numbers, counter
}

func main() {
	// 第一题
	foo1()
	// 第二题
	s := []int{1, 4, 9, 16, 2, 5, 10, 15}
	ret := foo2(s)
	fmt.Println("foo2 ret is:", ret)
	// 第三题
	numbers, counters := foo3(-200, 200, 100)
	fmt.Printf("numbers is: %v\ncounters is:%+v\n", numbers, counters)

}
